home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 11 / Cream of the Crop 11-1.iso / sound / simul100.zip / DELAY.C next >
C/C++ Source or Header  |  1995-12-27  |  4KB  |  135 lines

  1. /* █ DELAY.C ██████████████████████████████████████████████████████████████ */
  2. /*          Copyright 1995 by Ethan Brodsky.  All right reserved.           */
  3.  
  4. #ifndef __LARGE__
  5. #error DELAY must be compiled in the LARGE model
  6. #endif
  7.  
  8. // Configuration (Only SB16 supported)
  9. #define BASE_IO 0x220
  10. #define IRQ     5
  11. #define DMA8    1
  12. #define DMA16   5
  13.  
  14. #define BLOCK_LEN   220               /* Block length (2 blocks/DMA buffer) */
  15. #define BLOCK_DELAY 50                /* Number of blocks to delay          */
  16. #define RATE        44100             /* Sampling rate                      */
  17.  
  18. #include <alloc.h>
  19. #include <conio.h>
  20. #include <dos.h>
  21. #include <math.h>
  22. #include <mem.h>
  23. #include <stdio.h>
  24.  
  25. #include "simul.h"
  26.  
  27. int curinbuf  = BLOCK_DELAY-1;
  28. int curoutbuf = 0;
  29.  
  30. signed  short (far *tempbuf_16)[BLOCK_DELAY][BLOCK_LEN];
  31. unsigned char (far *tempbuf_8)[BLOCK_DELAY][BLOCK_LEN];
  32.  
  33. void far inthandler_16(void)
  34.  /* Copies data from 16-bit input buffer and converts it to 8-bit data */
  35.   {
  36.     int i;
  37.  
  38.    /* Copy data from DMA input buffer to 16-bit temporary buffer */
  39.     _fmemcpy((*tempbuf_16)[curinbuf], blockptr_16[curblock_16], 2*BLOCK_LEN);
  40.  
  41.    /* Convert 16-bit data to 8-bit data */
  42.     for (i = 0; i < BLOCK_LEN; i++)
  43.       (*tempbuf_8)[curinbuf][i] =
  44.        ((unsigned char)((*tempbuf_16)[curinbuf][i] >> 8) + 128);
  45.  
  46.    /* Change temporary input block */
  47.     curinbuf = (curinbuf+1) % BLOCK_DELAY;
  48.   }
  49.  
  50. void far inthandler_8(void)
  51.  /* Copies 8-bit data from temporary buffer to output buffer */
  52.   {
  53.    /* Copy data from 8-bit temporary buffer to DMA output buffer */
  54.     _fmemcpy(blockptr_8[curblock_8], (*tempbuf_8)[curoutbuf], BLOCK_LEN);
  55.  
  56.    /* Change temporary output block */
  57.     curoutbuf = (curoutbuf+1) % BLOCK_DELAY;
  58.   }
  59.  
  60. char vol_char(int vol)
  61.  /* Graphical display of sound volume */
  62.   {
  63.     if ((vol >= 0)     && (vol < 250))   return '·';
  64.     if ((vol >= 250)   && (vol < 1000))  return '∙';
  65.     if ((vol >= 1000)  && (vol < 2500))  return '■';
  66.     if ((vol >= 2500)  && (vol < 5000))  return '░';
  67.     if ((vol >= 5000)  && (vol < 10000)) return '▒';
  68.     if ((vol >= 10000) && (vol < 15000)) return '▓';
  69.     if ((vol >= 15000))                  return '█';
  70.  
  71.     return ' '; /* Satisfy complainer^H^H^H^H^Hiler ;-) */
  72.   }
  73.  
  74. int avg_vol(short far *buf16)
  75.  /* Calculates average amplitude in buffer */
  76.   {
  77.     int i;
  78.     long sum = 0;
  79.  
  80.     for (i = 0; i < BLOCK_LEN; i++)
  81.       sum += abs(buf16[i]);
  82.  
  83.     return sum / BLOCK_LEN;
  84.  
  85.   }
  86.  
  87. void main(void)
  88.   {
  89.     int i;
  90.  
  91.     init_sb(BASE_IO, IRQ, DMA8, DMA16, RATE);
  92.     set_blocklength(BLOCK_LEN);
  93.     get_buffers();
  94.  
  95.     install_handler_16(inthandler_16);
  96.     install_handler_8(inthandler_8);
  97.  
  98.    /* Allocate and clear all buffers */
  99.     tempbuf_16 = farmalloc(sizeof(*tempbuf_16));
  100.     tempbuf_8  = farmalloc(sizeof(*tempbuf_8));
  101.  
  102.     _fmemset((*tempbuf_16), 0x00, sizeof(*tempbuf_16));
  103.     _fmemset((*tempbuf_8),  0x80, sizeof(*tempbuf_8));
  104.  
  105.     start_output8();
  106.     start_input16();
  107.  
  108.     do
  109.       {
  110.        /*       buffer#     volume  intcounts */
  111.         printf("(%02u %02u) (%c %c) (%lu: %lu %lu) \n",
  112.                curinbuf, curoutbuf,
  113.                vol_char(avg_vol((*tempbuf_16)[((curinbuf-1) + BLOCK_DELAY) % BLOCK_DELAY])),
  114.                vol_char(avg_vol((*tempbuf_16)[curoutbuf])),
  115.                intcount, intcount_8, intcount_16);
  116.  
  117.        /* May occur at end, but I'm not sure why */
  118.         if (error)
  119.           {
  120.             printf("\a       **************** ERROR **************** \n");
  121.             error = 0;
  122.           }
  123.       }
  124.     while (!kbhit());
  125.  
  126.     getch();
  127.  
  128.     stop_sound();
  129.  
  130.     farfree(tempbuf_8);
  131.     farfree(tempbuf_16);
  132.  
  133.     free_buffers();
  134.     shutdown_sb();
  135.   }